﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataLayer.EF;
using EntityLayer;

namespace DataLayer.CLASES_Seguridad_DAO
{
    public class clsOpcionDAO
    {
        public Seguridad_GestionActivos_Entities DBSEGURIDAD = new Seguridad_GestionActivos_Entities();

        public List<T_Opcion> Listar()
        {
            try
            {
                var q = from c in DBSEGURIDAD.T_Opcion
                        select c;

                return q.ToList();

            }
            catch (Exception ex)
            {
                return new List<T_Opcion>();
            }
        }

        public bool Insertar(T_Opcion Obj)
        {
            try
            {
                DBSEGURIDAD.AddObject("T_Opcion", Obj);
                DBSEGURIDAD.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public bool Modificar(T_Opcion obj)
        {
            try
            {
                DBSEGURIDAD.AttachTo("T_Opcion", obj);
                DBSEGURIDAD.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                DBSEGURIDAD.SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public bool Eliminar(T_Opcion obj)
        {
            try
            {
                DBSEGURIDAD.AttachTo("T_Opcion", obj);
                DBSEGURIDAD.DeleteObject(obj);
                DBSEGURIDAD.SaveChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public List<int> ObtenerOpcionesPorGrupo(int idGrupo)
        {
            List<int> lis = new List<int>();
            List<T_Opcion> listaOpcion = new List<T_Opcion>();
            try
            {
                var q = from c in DBSEGURIDAD.T_Opcion
                        where c.ID_OPCION == idGrupo
                        select c;

                listaOpcion = q.ToList();

                foreach (T_Opcion item in listaOpcion)
                {
                    lis.Add(item.ID_OPCION);
                }
                return lis;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public List<int> ObtenerOpcionesPorGrupo2(int idGrupo)
        {
            List<int> lis = new List<int>();
            List<V_Grupo_Opcion> listaOpcion = new List<V_Grupo_Opcion>();
            try
            {
                var q = from c in DBSEGURIDAD.V_Grupo_Opcion
                        where c.ID_GRUPO == idGrupo
                        select c;

                listaOpcion = q.ToList();

                foreach (V_Grupo_Opcion item in listaOpcion)
                {
                    lis.Add(item.ID_OPCION);
                }

                return lis;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public T_Opcion ObtenerOpcionxId(int idOpcion)
        {
            List<T_Opcion> lis = new List<T_Opcion>();
            try
            {
                var q = from c in DBSEGURIDAD.T_Opcion
                        where c.ID_OPCION == idOpcion
                        select c;

                lis = q.ToList();
                return lis[0];
            }
            catch (Exception ex)
            {
                return new T_Opcion();
            }
        }

        public List<V_Opcion> ObtenerPorUsuario(string userName, int idPadre)
        {
            List<V_Opcion> lis = new List<V_Opcion>();

            try
            {
                var q = from v in DBSEGURIDAD.V_Opcion
                        where v.ID_USUARIO == userName
                         && v.ID_PADRE == idPadre
                         && v.IND_ESTADO == "A"
                        group new { v } by new
                        {
                            v.ID_OPCION,
                            v.DES_NOMBRE,
                            v.DES_URL,
                            v.ID_PADRE,
                            v.ID_USUARIO,
                            v.IND_TIPO,
                            v.NUM_NIVEL,
                            v.NRO_ORDEN,
                        } into g
                        select g;

                foreach (var s in q)
                {
                    V_Opcion obj = new V_Opcion();
                    obj.ID_OPCION = s.Key.ID_OPCION;
                    obj.DES_NOMBRE = s.Key.DES_NOMBRE;
                    obj.DES_URL = s.Key.DES_URL;
                    obj.ID_PADRE = s.Key.ID_PADRE;
                    obj.ID_USUARIO = s.Key.ID_USUARIO;
                    obj.IND_TIPO = s.Key.IND_TIPO;
                    obj.NUM_NIVEL = s.Key.NUM_NIVEL;
                    obj.NRO_ORDEN = s.Key.NRO_ORDEN;
                    lis.Add(obj);
                }
            }
            catch (Exception)
            {
                return null;
            }

            return lis.OrderBy(x => x.NRO_ORDEN).ToList();
        }

        public int GetNroSubNodos(int? idPadre)
        {
            try
            {
                var q = from p in DBSEGURIDAD.T_Opcion
                        where p.ID_PADRE == idPadre
                        where p.IND_ESTADO != "E"
                        select p;

                return q.ToList().Count;
            }
            catch (Exception ex)
            {
                return 0;
            }
        }

        public int ObtenerIdOpcionMax()
        {
            int id_opcion = 0;

            try
            {
                var q = (from c in DBSEGURIDAD.T_Opcion.ToList()
                         select c.ID_OPCION).DefaultIfEmpty(0).Max();

                id_opcion = q;
                return id_opcion + 1;
            }
            catch (Exception ex)
            {
                return 1;
            }
        }

        public int GrabarOpcion(T_Opcion Obj)
        {
            List<int> lis = new List<int>();
            List<T_Opcion> listaOpcion = new List<T_Opcion>();
            T_Opcion grupoInsert = new T_Opcion();
            int grupoid = 0;
            try
            {
                DBSEGURIDAD.AddObject("T_Opcion", Obj);
                DBSEGURIDAD.SaveChanges();

                var q = from c in DBSEGURIDAD.T_Opcion
                        where c.ID_OPCION == Obj.ID_OPCION
                        select c;

                listaOpcion = q.ToList();
                grupoid = Convert.ToInt32(Obj.ID_OPCION);
                return grupoid;
            }
            catch (Exception ex)
            {
                return 0;
            }
        }

        public bool EliminarOpcionGrupo(int idOpcion)
        {
            try
            {
                int n = DBSEGURIDAD.ExecuteStoreCommand("DELETE FROM T_GRUPO_OPCION WHERE ID_OPCION=" + idOpcion);
                return (n == 1 ? true : false);
            }
            catch
            {
                return false;
            }
        }

        public int ObtenerNroElementosPorNodo(int? IdPadre)
        {
            int nodos = 0;
            try
            {
                var q = (from c in DBSEGURIDAD.T_Opcion.ToList()
                         where c.ID_PADRE == IdPadre && c.IND_ESTADO == "E"
                         select c).DefaultIfEmpty().Count();

                nodos = q;
                return nodos;
            }
            catch (Exception ex)
            {
                return 0;
            }
        }

        public List<V_Grupo_Opcion> listarGrupoOpcion()
        {
            List<V_Grupo_Opcion> lista = new List<V_Grupo_Opcion>();
            try
            {
                var q = from c in DBSEGURIDAD.V_Grupo_Opcion
                        select c;
                lista = q.ToList();
                return lista;
            }
            catch
            {
                return new List<V_Grupo_Opcion>();
            }
        }


    }
}
